导航菜单
首页 >  一文详解PnP算法原理  > 一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达

一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达

1 pnp算法概念和原理介绍 1.1 pnp算法的概念

下面几种说法都是对pnp算法要做的事情的描述,大家自己体会一下

1、PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。——《视觉SLAM十四讲》(参考)

2、通俗的讲,PnP问题就是在已知世界坐标系下N个空间点的真实坐标以及这些空间点在图像上的投影,如何计算相机所在的位姿。罗嗦一句:已知量是空间点的真实坐标和图像坐标,未知量(求解量)是相机的位姿。

3、PnP是用来求解3D-2D点对运动的方法(参考)

4、PnP问题就是指通过世界中的N个特征点与图像成像中的N个像点,计算出其投影关系,从而获得相机或物体位姿的问题(参考)

1.2 pnp算法的概念总结

下面我在来简单总结一下我个人的理解(参考):image.png

使用Perspective-n-Point (PnP)算法需要知道的已知量和需要求解的未知量:

1.2.1 PnP需要知道的已知量

1、需要知道n个世界坐标系下参考点的3D坐标系:$\left{c_1, c_2, c_3, ..., c_n\right}$

2、同时知道这个n个3D坐标对应相机图像坐标系上的2D投影点:$\left{u_1, u_2, u_3, ..., u_n\right}$

注意:

世界坐标系下的3D点和相机坐标系下投影的2D点是一一对应的相机图像坐标系,并不是相机坐标系或相机像素坐标系,注意区分

下图是四大坐标系:

image.png

3、已知相机摄像头的内参(需要自己提前标注好),相机的摄像头内参包括两部分;

相机的内参矩阵相机畸变系数

内参矩阵:

$$ \text { camera matrix }=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right] $$

焦距$(f_x, f_y)$和光学中心$(c_x, c_y)$

畸变系数:

$k_1、k_2、k_3$:是径向畸变$p_1、p_2$:是切向畸变1.2.2 PnP需要求的未知量

求世界坐标系与摄像机坐标系之间的位姿变换 :$\left{R|t\right}$

R:是旋转矩阵,可以理解为绕x、y、z三个坐标轴方向的旋转t:是平移,可以理解为沿x、y、z三个方向上的平移

所以从一个坐标系变换到另外一个坐标系的位姿变换的自由度就是6,三个方向上的旋转和三个方向上的平移。(参考)

1.3 PnP算法的用处

从上面可以知道PnP就是计算出两个坐标系之间的位姿变换的:$\left{R|t\right}$

因此PnP用途也很多:

相机位姿跟踪物体位姿跟踪AR/VR、机器人操作SLAM中位姿初值求解相机标定,相机和激光雷达联合标定等2 PnP的常见解法

PnP的常用解法也有很多:DLT,P3P,EPnP,UPnP

2.1 PnP解法之DLT 参考:https://zhuanlan.zhihu.com/p/586489372.2 PnP解法之P3P 参考:https://www.jianshu.com/p/b3e9fb2ad0dc

上面的文章中还介绍了很多其他的解法

2.3 PnP解法之EPnP 参考:https://blog.csdn.net/jessecw79/article/details/82945918

PnP问题是研究如何从3D-2D匹配对中求解摄像头位姿,EPnP算法是一种非迭代的PnP算法

3 opencv中solvePn()函数的介绍与使用 3.1 opencv中solvePnP函数的定义

1、在opencv中的slovePnP函数的定义:image.png

3.2 solvePnP()中参数含义: 参考:https://blog.csdn.net/cocoaqin/article/details/77485436参考:https://blog.csdn.net/u010554381/article/details/81983992参考:https://blog.csdn.net/cocoaqin/article/details/778485883.2.1 solvePnP()中的参数

1、下面是solvePnP()函数参数含义解释(参考):

image.png

objectPoints:特征点的世界坐标,坐标值需为float型,不能为double型,可以为mat类型,也可以直接输入vector

imagePoints:特征点在图像中的像素坐标,可以输入mat类型,也可以直接输入vector,注意输入点的顺序要与前面的特征点的世界坐标一一对应

cameraMatrix:相机内参矩阵

distCoeffs:相机的畸变参数【Mat_(5, 1)】

rvec:输出的旋转向量:

tvec:输出的平移向量

useExtrinsicGuess: 用于SOLVEPNP迭代的参数。如果为true(1),函数使用提供的rvec和tvec值分别作为旋转和平移向量的初始近似,并进一步优化它们。默认值为False。

flags:PnP的计算方法

3.2.2 sovlePnP()中flags参数对应的PnP计算方法

flags取值对应的是PnP的计算方法,flags的参数选择(参考):

enum {SOLVEPNP_ITERATIVE = 0,SOLVEPNP_EPNP = 1, //!

相关推荐: